/**
 *
 * @param {array} position  查询的点的位置
 * @param {object} service {name,layerId} name是IG Server服务的名称,layerId是要素所在的图层
 * @param {callback} successCallback 成功之后的回调
 */
function queryPoint({ position, service, successCallback }) {
  //1、创建一个用于查询的点形状
  let pointObj = new Zondy.Object.Point2D(position[0], position[1]);
  //设置查询点的搜索半径
  pointObj.nearDis = 1;
  //2、初始化查询结构对象，设置查询结构包含几何信息
  var queryStruct = new Zondy.Service.QueryFeatureStruct();
  //是否包含几何图形信息
  queryStruct.IncludeGeometry = true;
  //是否包含图形显示参数
  queryStruct.IncludeWebGraphic = true;
  //3、指定查询规则
  var rule = new Zondy.Service.QueryFeatureRule({
    //是否将要素的可见性计算在内
    EnableDisplayCondition: false,
    //是否完全包含
    MustInside: false,
    //是否仅比较要素的外包矩形
    CompareRectOnly: false,
    //是否相交
    Intersect: true,
  });
  //4、实例化查询参数对象
  var queryParam = new Zondy.Service.QueryParameter({
    geometry: pointObj,
    resultFormat: 'json',
    struct: queryStruct,
    rule: rule,
  });
  //5、实例化地图文档查询服务对象
  var queryService = new Zondy.Service.QueryDocFeature(
    queryParam,
    service.name,
    service.layerId,
    {
      ip: 'localhost',
      port: '6163', //访问IGServer的端口号，.net版为6163，Java版为8089
    }
  );
  //执行查询操作，querySuccess为查询回调函数
  queryService.query(successCallback);
}

class Query {
  constructor(options) {
    this.service = options.service;
    this.layerID = options.layerID;
    this.host = options.host || HOST;
    this.port = options.port || PORT;
  }

  /**
   * 根据几何信息查询
   * @param {ol.Feature.Geometry} geom : 用于查询的几何图形
   * @param {function} querySuccess : 成功的回调
   */
  queryByGeom(geom, querySuccess, type) {
    if (!querySuccess) {
      throw new Error('必须设置第二个参数(成功的回调)');
    }
    let geomObj; //注意let const在{}里面会形成块级作用域
    // 3.1 创建查询的几何图形
    if (type == 'Circle') {
      // 创建一个用于查询的圆
      geomObj = new Zondy.Object.Circle();
      // 将ol的几何图形转换成中地的几何图形
      geomObj.setByOL(geom);
    } else {
      // 创建一个用于查询的区
      geomObj = new Zondy.Object.Polygon();
      // 将ol的几何图形转换成中地的几何图形
      geomObj.setByOL(geom);
    }
    // 3.2 设置查询的结构
    const queryStruct = new Zondy.Service.QueryFeatureStruct({
      IncludeAttribute: true, // 需要包含属性信息
      IncludeGeometry: true, // 需要包含几何信息
      IncludeWebGraphic: true, // 需要包含样式信息
    });

    // 3.3 设置查询规则
    const rule = new Zondy.Service.QueryFeatureRule({
      //是否相交
      Intersect: true,
    });

    // 3.4 创建查询参数
    const queryParam = new Zondy.Service.QueryParameter({
      geometry: geomObj,
      struct: queryStruct,
      rule: rule,
      //显示查询到的要素数量
      cursorType: null,
    });
    //设置查询分页号
    queryParam.pageIndex = 0;
    //设置查询要素数目
    queryParam.recordNumber = 100;

    // 3.5 调用查询的接口
    const queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      this.service,
      this.layerID,
      {
        ip: this.host,
        port: this.port, //访问IGServer的端口号，.net版为6163，Java版为8089
      }
    );
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(querySuccess);
  }

  /**
   * 根据sql查询
   * @param {string} sql : sql的where条件语句
   * @param {function} querySuccess : 成功的回调
   */
  queryBySQL(sql, querySuccess) {
    // 2.1 设置查询结构
    const queryStruct = new Zondy.Service.QueryFeatureStruct({
      IncludeAttribute: true, // 需要包含属性信息
      IncludeGeometry: true, // 需要包含几何信息
      IncludeWebGraphic: true, // 需要包含样式信息
    });
    // 2.2 设置查询参数, where条件
    const queryParam = new Zondy.Service.QueryParameter({
      struct: queryStruct,
      //显示查询到的要素数量
      cursorType: null,
    });
    queryParam.where = sql;
    // 2.3 调用查询接口
    const queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      this.service,
      this.layerID,
      {
        ip: this.host,
        port: this.port, //访问IGServer的端口号，.net版为6163，Java版为8089
      }
    );
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(querySuccess);
  }

  /**
   * 根据OID查询
   * @param {string} fids : OID的值, 多个值使用,连接(中间不能写空格) eg '1,2'
   * @param {function} querySuccess : 成功的回调
   */
  queryByFID(fids, querySuccess) {
    // 2.1 设置查询结构
    const queryStruct = new Zondy.Service.QueryFeatureStruct({
      IncludeAttribute: true, // 需要包含属性信息
      IncludeGeometry: true, // 需要包含几何信息
      IncludeWebGraphic: true, // 需要包含样式信息
    });
    // 2.2 设置查询参数, where条件
    const queryParam = new Zondy.Service.QueryParameter({
      objectIds: fids,
      struct: queryStruct,
      //显示查询到的要素数量
      cursorType: null,
    });
    // 2.3 调用查询接口
    const queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      this.service,
      this.layerID,
      {
        ip: this.host,
        port: this.port, //访问IGServer的端口号，.net版为6163，Java版为8089
      }
    );
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(querySuccess);
  }
}
export { queryPoint, Query };
